جزوه · چالش‌های فصل اول: استفاده از compgen بازگشت به فهرست
📘 چالش‌های فصل اول استفاده از compgen
📅 تاریخ: ۱۹ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

در طول فصل اول با دستورات پایه لینوکس آشنا شدید. یکی از دستورات مفید در پوسته Bash دستور compgen است که برای تکمیل خودکار (Auto-completion) در خط فرمان استفاده می‌شود. اما در پوسته Zsh که شما از آن استفاده می‌کنید، این دستور به صورت پیش‌فرض وجود ندارد.

⚠️ چالش اصلی:

در Zsh، دستور compgen یک دستور داخلی Bash است و به همین دلیل با خطای command not found مواجه می‌شوید.

▍ چالش اول: خطای command not found

┌──(ya3in㉿kali)-[~] └─$ compgen -a compgen: command not found └─$ compgen -d compgen: command not found

توضیح: همان‌طور که در تصویر می‌بینید، Zsh این دستور را نمی‌شناسد.

❌ دلیل خطا:
  • compgen یک دستور built-in در پوسته Bash است.
  • Zsh از یک سیستم تکمیل خودکار متفاوت استفاده می‌کند که با compgen سازگار نیست.
  • حتی اگر Zsh را نصب کرده باشید، compgen به طور پیش‌فرض در دسترس نیست.

▍ راه‌حل‌ها

• راه‌حل اول: استفاده از ابزارهای Zsh

Zsh ابزارهای مخصوص خود را برای تکمیل خودکار دارد. در اینجا معادل‌های compgen در Zsh آورده شده است:

دستور Bash معادل در Zsh توضیح
compgen -a type -m '*' لیست همه دستورات قابل اجرا
compgen -d printf '%s\n' $path لیست دایرکتوری‌های PATH
compgen -c print -rlo -- $commands:t لیست همه دستورات خارجی (external)
compgen -b print -rlo -- $builtins لیست دستورات داخلی (built-in)
compgen -A function print -rlo -- $functions لیست توابع تعریف‌شده
compgen -A variable print -rlo -- ${(k)parameters} لیست متغیرهای تعریف‌شده

• مثال‌های عملی

┌──(ya3in㉿kali)-[~] └─$ type -m '*' bash
zsh
ls
cd
echo
grep
...

نمایش همه دستورات قابل اجرا (معادل compgen -a).

┌──(ya3in㉿kali)-[~] └─$ printf '%s\n' $path /usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games

نمایش دایرکتوری‌های PATH (معادل compgen -d).

┌──(ya3in㉿kali)-[~] └─$ print -rlo -- $builtins | head -10 .
:
[
alias
autoload
bindkey
builtin
cd
chdir
command

نمایش ۱۰ دستور داخلی اول Zsh (معادل compgen -b).

• راه‌حل دوم: فعال‌سازی سازگاری با Bash در Zsh

اگر به compgen نیاز دارید، می‌توانید با اجرای دستور زیر، یک لایه سازگاری در Zsh فعال کنید:

┌──(ya3in㉿kali)-[~] └─$ bashcompinit

توضیح: این دستور، قابلیت تکمیل خودکار (Tab Completion) مخصوص Bash را در Zsh فعال می‌کند.

✅ نکته:

پس از اجرای bashcompinit، می‌توانید از compgen استفاده کنید. اما به یاد داشته باشید که این کار فقط برای جلسه فعلی Zsh معتبر است. برای دائمی کردن آن، bashcompinit را به فایل ~/.zshrc اضافه کنید.

▍ چالش دوم: تفاوت در خروجی

حتی اگر compgen را در Zsh فعال کنید، خروجی آن ممکن است با Bash متفاوت باشد زیرا سیستم تکمیل خودکار Zsh پیچیده‌تر است.

💡 توصیه نهایی:
  • اگر به دنبال مشاهده لیست دستورات هستید، از روش‌های بومی Zsh استفاده کنید.
  • اگر برای اسکریپت‌نویسی به compgen نیاز دارید، از bashcompinit استفاده کنید.
  • بهترین روش: یادگیری ابزارهای تکمیل خودکار Zsh (مانند Tab دو بار و zsh-completions).

▍ جمع‌بندی

چالش راه‌حل
دستور compgen پیدا نمی‌شود از معادل‌های Zsh مانند type -m '*' و printf '%s\n' $path استفاده کنید
نیاز به compgen برای اسکریپت دستور bashcompinit را اجرا کنید یا به ~/.zshrc اضافه کنید
تفاوت خروجی با Bash از روش‌های بومی Zsh استفاده کنید که با محیط شما سازگارتر است
✅ تمرین پیشنهادی:
  • با type -m '*' | head -20 اولین ۲۰ دستور قابل اجرا را مشاهده کنید.
  • با printf '%s\n' $path دایرکتوری‌های PATH را لیست کنید.
  • اگر اسکریپتی دارید که به compgen نیاز دارد، bashcompinit را در ~/.zshrc قرار دهید.